use std::collections::HashSet;

pub struct CommandTable {
    supported_commands: HashSet<&'static [u8]>,
}

impl Default for CommandTable {
    fn default() -> Self {
        Self {
            supported_commands: SUPPORTED_COMMANDS.iter().cloned().collect(),
        }
    }
}

impl CommandTable {
    pub fn is_supported(&self, cmd: &[u8]) -> bool {
        self.supported_commands.contains(cmd)
    }
}

const SUPPORTED_COMMANDS: [&[u8]; 137] = [
    b"restore",
    b"zrangebylex",
    b"zcount",
    b"ttl",
    b"touch",
    b"rpoplpush",
    b"decr",
    b"pttl",
    b"zrevrank",
    b"georadiusbymember_ro",
    b"persist",
    b"zrem",
    b"zinterstore",
    b"hincrbyfloat",
    b"bitcount",
    b"get",
    b"sscan",
    b"incrby",
    b"xpending",
    b"xclaim",
    b"hexists",
    b"xlen",
    b"hlen",
    b"pfadd",
    b"smembers",
    b"geodist",
    b"lset",
    b"geohash",
    b"pfmerge",
    b"mget",
    b"set",
    b"dump",
    b"setex",
    b"zremrangebyrank",
    b"blpop",
    b"zscan",
    b"append",
    b"srem",
    b"pexpire",
    b"hstrlen",
    b"zremrangebyscore",
    b"xack",
    b"hsetnx",
    b"lpushx",
    b"georadius",
    b"spop",
    b"asking",
    b"srandmember",
    b"sismember",
    b"zlexcount",
    b"zscore",
    b"zpopmin",
    b"expire",
    b"sdiffstore",
    b"setbit",
    b"rpop",
    b"lpop",
    b"hgetall",
    b"lpush",
    b"hmget",
    b"xrevrange",
    b"hdel",
    b"lrem",
    b"rename",
    b"pfcount",
    b"sunion",
    b"hincrby",
    b"geopos",
    b"echo",
    b"georadiusbymember",
    b"pexpireat",
    b"getbit",
    b"xadd",
    b"rpush",
    b"zpopmax",
    b"type",
    b"exists",
    b"georadius_ro",
    b"zrevrangebylex",
    b"zrevrangebyscore",
    b"linsert",
    b"sort",
    b"zrevrange",
    b"setnx",
    b"lindex",
    b"hget",
    b"info",
    b"zadd",
    b"sinter",
    b"expireat",
    b"hvals",
    b"hset",
    b"xdel",
    b"hkeys",
    b"del",
    b"decrby",
    b"setrange",
    b"zcard",
    b"xrange",
    b"sdiff",
    b"brpoplpush",
    b"bitfield",
    b"cluster",
    b"geoadd",
    b"bzpopmin",
    b"mset",
    b"strlen",
    b"incr",
    b"getrange",
    b"bzpopmax",
    b"ping",
    b"smove",
    b"incrbyfloat",
    b"bitpos",
    b"rpushx",
    b"zunionstore",
    b"hmset",
    b"getset",
    b"zrange",
    b"config",
    b"zrank",
    b"psetex",
    b"zremrangebylex",
    b"sadd",
    b"ltrim",
    b"sinterstore",
    b"brpop",
    b"lrange",
    b"eval",
    b"zincrby",
    b"unlink",
    b"hscan",
    b"zrangebyscore",
    b"scard",
    b"xtrim",
    b"llen",
    b"command",
];
